package com.auth.manager.utils;

import io.jsonwebtoken.*;

import java.util.Date;
import java.util.Objects;

/**
 * @version 1.0.0
 * @Date: 2022/4/27 9:26
 * @Author ZhuYouBin
 * @Description
 */
public class JwtTokenUtil {

    /**
     * Token的请求头名称
     */
    public static final String TOKEN_NAME = "Authentication";
    /**
     * Token加密密钥
     */
    private static final String TOKEN_SECRET = "AUTH_MANAGER";
    /**
     * Token有效时间
     */
    private static final long TOKEN_EXPIRATION = 60 * 60 * 1000;

    /**
     * 生成Token
     * @param username 当前登录用户名称
     * @return 返回生成的Token
     */
    public static String generateToken(String username) {
        // Token生成时间
        final Date currentDate = new Date();
        // Token过期时间
        final Date expirationDate = new Date(currentDate.getTime() + TOKEN_EXPIRATION);
        // 返回生成的Token信息
        return Jwts.builder()
                .setSubject(username) // 设置主体信息
                .setIssuedAt(currentDate) // 生成时间
                .setExpiration(expirationDate) // 过期时间
                .signWith(SignatureAlgorithm.HS512, TOKEN_SECRET) // 加密
                .compact(); // 生成合并Token信息
    }

    /**
     * 从 Token 里面获取声明信息
     * @param token 前端传输过来的Token
     * @return
     */
    public static Claims getClaimsFromToken(String token) {
        return Jwts.parser()
                    .setSigningKey(TOKEN_SECRET)
                    .parseClaimsJws(token)
                    .getBody();
    }

    /**
     * 从 Token 里面获取用户名称
     * @param token 前端传输过来的Token
     * @return
     */
    public static String getUsernameFromToken(String token) {
        Claims claims = getClaimsFromToken(token);
        String username = null;
        if (!Objects.isNull(claims)) {
            username = claims.getSubject();
        }
        return username;
    }

    /**
     * Token是否过期
     * @param claims
     * @return
     */
    public static boolean isTokenExpired(Claims claims) {
        if (Objects.isNull(claims)) {
            return false;
        }
        return claims.getExpiration().before(new Date());
    }

    /**
     * 校验 Token 是否合法
     * @param token 前端传输过来的Token
     * @return
     */
    public static boolean isTokenValid(String token) {
        Claims claims = getClaimsFromToken(token);
        return isTokenExpired(claims);
    }

}
